package org.itzheng.yuezhi.utils;

import android.text.TextUtils;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * Title:自定义Log输出,可输出json数据等<br>
 * Description: <br>
 * Company: <br>
 *
 * @author ZhengYongdong
 * @email ItZheng@ZoHo.com
 * @date 2016/7/7 0007
 */
public class MyLog {
    private static String TAG = "";
    /**
     * log level
     */
    private static int LOG_LEVEL = Log.VERBOSE;
    /**
     * 字符串缩进
     */
    private static int JSON_INDENT = 2;

    /**
     * 分页打印log
     *
     * @param TAG
     * @param remark    备注(方法名+行数),单独抽出来是为了方便下一行去掉
     * @param msg       要打印的log内容
     * @param showCount 一行显示多少字符,不要超过编译器的长度
     */
    private static void showLogCompletion(String TAG, String remark, String msg, int showCount) {

        if (TextUtils.isEmpty(msg) || msg.length() < showCount) {
            Log.d(TAG, remark + msg);
        } else {
            String show = msg.substring(0, showCount);
            Log.d(TAG, remark + show);
            String partLog = msg.substring(showCount, msg.length());
            //第二行后就没有方法名和行数了
            showLogCompletion(TAG, "", partLog, showCount);
        }
    }

    /**
     * 将方法名包装成特定格式,方便查看
     *
     * @param method
     * @return
     */
    private static String getMethodFormat(String method) {
        return "[" + method + "]";
    }

    /**
     * 获取当前调用的方法名,当没有设置方法时调用默认方法,但是当混淆后,就只出现a,b,c等
     *
     * @return
     */
    private static String getCurrentMethodName() {
        StackTraceElement elm = Thread.currentThread().getStackTrace()[5];
        TAG = elm.getClassName();
        return elm.getMethodName();
    }

    private static String getLineNumber() {
        StackTraceElement elm = Thread.currentThread().getStackTrace()[5];
        return "(" + elm.getLineNumber() + ")" + ": ";
    }

    public static void v(String TAG, String method, String msg) {
        if (LOG_LEVEL <= Log.VERBOSE) {

        } else {
            return;
        }
        if (TextUtils.isEmpty(method)) {
            Log.v(TAG, msg);
        } else {
            Log.v(TAG, getMethodFormat(method) + getLineNumber() + msg);
        }

    }

    public static void v(String TAG, String msg) {
        v(TAG, getCurrentMethodName(), msg);
    }

    public static void v(String msg) {
        v(TAG, msg);
    }

    public static void d(String TAG, String method, String msg) {
        if (LOG_LEVEL <= Log.DEBUG) {

        } else {
            return;
        }
        if (TextUtils.isEmpty(method)) {
            showLogCompletion(TAG, getMethodFormat(getCurrentMethodName()) + getLineNumber(), msg, 1024);
        } else {
            showLogCompletion(TAG, getMethodFormat(method) + getLineNumber(), msg, 1024);
        }

    }

    public static void d(String TAG, String msg) {
        d(TAG, getCurrentMethodName(), msg);
    }

    public static void d(String msg) {
        d(TAG, msg);
    }

    public static void i(String TAG, String method, String msg) {
        if (LOG_LEVEL <= Log.INFO) {

        } else {
            return;
        }
        if (TextUtils.isEmpty(method)) {
            Log.i(TAG, msg);
        } else {
            Log.i(TAG, getMethodFormat(method) + getLineNumber() + msg);
        }

    }

    public static void i(String TAG, String msg) {
        i(TAG, getCurrentMethodName(), msg);
    }

    public static void i(String msg) {
        i(TAG, msg);
    }

    public static void w(String TAG, String method, String msg) {
        if (LOG_LEVEL <= Log.WARN) {

        } else {
            return;
        }
        if (TextUtils.isEmpty(method)) {
            Log.w(TAG, msg);
        } else {
            Log.w(TAG, getMethodFormat(method) + getLineNumber() + msg);
        }

    }

    public static void w(String TAG, String msg) {
        i(TAG, getCurrentMethodName(), msg);
    }

    public static void w(String msg) {
        i(TAG, msg);
    }

    public static void e(String TAG, String method, String msg) {
        if (LOG_LEVEL <= Log.ERROR) {

        } else {
            return;
        }
        if (TextUtils.isEmpty(method)) {
            Log.e(TAG, msg);
        } else {
            Log.e(TAG, getMethodFormat(method) + getLineNumber() + msg);
        }

    }

    public static void e(String TAG, String msg) {
        e(TAG, getCurrentMethodName(), msg);
    }

    public static void e(String msg) {
        e(TAG, msg);
    }

    public static void json(String json) {
        if (TextUtils.isEmpty(json)) {
            d(TAG, "Empty/Null json content");
            return;
        }
        try {
            json = json.trim();
            if (json.startsWith("{")) {
                JSONObject jsonObject = new JSONObject(json);
                String message = jsonObject.toString(JSON_INDENT);
                d(TAG, message);
                return;
            }
            if (json.startsWith("[")) {
                JSONArray jsonArray = new JSONArray(json);
                String message = jsonArray.toString(JSON_INDENT);
                d(TAG, message);
                return;
            }
            e(TAG, "Invalid Json");
        } catch (JSONException e) {
            e(TAG, "Invalid Json");
        }
    }
}
